﻿// 0727train02.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <limits.h> //INT_MAX必备

using namespace std;


/*
题目
删除字符串s中出现次数最少的字符，如果多个字符出现次数一样则都删除。
输入
输入只包含小写字母
输出描述
输出删除后剩余的字符串；若删除后字符串长度为0，则输出字符串"empty"

输入
abcdd
输出
dd

输入
aabbccdd
输出
empty

*/

void solve01(string &oh_str)
{
    unordered_map<char, int>oh_map;

    for (auto &oh_char : oh_str)
    {
        if (oh_map.count(oh_char))
        {
            oh_map[oh_char] += 1;
        }
        else
        {
            oh_map[oh_char] = 1;
        }
    }

    int min_count = INT_MAX;
    for (auto& item : oh_map)
    {
        int curr_count = item.second;
        min_count = min(curr_count, min_count);
    }

    string result;
    for (auto& oh_char : oh_str)
    {
        if (oh_map[oh_char] != min_count)
        {
            result += oh_char;
        }
    }
    if (result.size()>0)
    {
        cout << result;
        return;
    }
    cout << "empty";
    //solve01
    //------
}


/*
 给定一个字符串 s ，找到 它的第一个不重复的字符，输出第一个满足条件的字符 。如果不存在，则返回 -1 。

输入: s = "leetcode"
输出: 0

输入: s = "loveleetcode"
输出: 2

输入: s = "aabb"
输出: -1
https://www.nowcoder.com/practice/e896d0f82f1246a3aa7b232ce38029d4
 */

struct StrNode
{
    int index, count = 1;

    void addCount()
    {
        count += 1;
    }

    StrNode() = default;
    StrNode(int index, int count) :index(index), count(count) {};
};


void solve02(string oh_str)
{
	//1扫第一遍，记在map里
    //2挑出oh_map[oh_char]=1
    //3塞到数组里，如果数组size>1，排序
    unordered_map<char, StrNode>oh_map;

    for (int i=0; i < oh_str.size();i++)
    {
        char oh_char = oh_str[i];
	    if (!oh_map.count(oh_char))
	    {
            StrNode node(i, 1);
            oh_map[oh_char] = node;
	    }
        else
        {
            StrNode& node = oh_map[oh_char];
            node.addCount();
            //cout << node.count;
        }
        //------for
    }

    //存索引
    vector<int>result;
    for (auto &map_item : oh_map)
    {
        StrNode& node = map_item.second;
	    if (node.count==1)
	    {
            result.push_back(node.index);
	    }
    }

    if (result.empty())
    {
        cout << -1;
        return;
    }

    if (result.size()==1)
    {
        int index = result[0];
        cout << oh_str[index];
        return;
    }

    sort(result.begin(), result.end());
    int index = result[0];
    cout << oh_str[index];

    //solve02
    //------
}


/*
两个整数数组 nums1 和 nums2，以数组形式返回两数组的交集
返回结果中每个元素出现的次数，应与元素在两个数组中都出现的次数一致

输入
nums1 = [1,2,2,1], nums2 = [2,2]
输出
[2,2]


输入
nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出
[4,9]

 */
struct CountNode
{
    int count1 = 0, count2 = 0;
    void addCount1()
    {
        count1 += 1;
    }
    void addCount2()
    {
        count2 += 1;
    }

    CountNode() = default;
    CountNode(int count1, int count2) :count1(count1), count2(count2) {};
};

vector<int>solve03(vector<int>&nums1, vector<int>& nums2)
{
    vector<int>result_vec;
    unordered_map<int, CountNode>oh_map;
    for (auto&num: nums1)
    {
        if (!oh_map.count(num))
        {
            CountNode node(1, 0);
            oh_map[num] = node;
        }
        else
        {
            CountNode &node = oh_map[num];
            node.addCount1();
        }
        //for------
        //------
    }

    for (auto&num: nums2)
    {
	    if (oh_map.count(num))
	    {
            CountNode& node = oh_map[num];
            node.addCount2();
	    }
    }

    for (auto &map_item:oh_map)
    {
        CountNode& node = map_item.second;
        if (node.count1>0 && node.count2 > 0)
        {
            int real_count = min(node.count1, node.count2);
            while (real_count--)
            {
                result_vec.push_back(map_item.first);
            }
            
        }
    }

    //for (auto&num: result_vec)
    //{
    //    cout << num << ' ';
    //}
    return result_vec;
    //solve03
    //-------
}

int main()
{

	{
        //1扫一遍nums1,往map里存
        //2扫一遍nums2，更新map count
        //3vector<int>result_vec, count!=0, push

        //nums1 = [1,2,2,1], nums2 = [2,2]
        //[2,2]
        //nums1 = [4,9,5], nums2 = [9,4,9,8,4]
        //[4,9]
        vector<int> nums1 = { 1,2,2,1 };
        vector<int> nums2 = { 2,2 };
        solve03(nums1, nums2);

        return 0;
	}

	{
        string input;
        cin >> input;
        //leetcode l loveleetcode v aabb -1
        //string input = "aabb";
        solve02(input);


        return 0;
	}


    //abcdd dd
    //aabbccdd empty
    //string oh_str = "aabbccdd";
    string oh_str;
    cin >> oh_str;

    solve01(oh_str);
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
